Попробуем переместить камеру через нажатие клавиш. Этот способ не совсем правильный, но его всех проще реализовать. В конце этого шага я расскажу о недостатках такого способа.
Для начала откроем свой последний проект. И добавим одну единственную функцию реагирующую на клавиши. Установим мигающий курсор в класс CMainWnd и добавим событие: WM_CHAR - OnChar, более подробно о событиях рассказано в "Шаг 11 - Добавляем событие OnPaint, LButtonDbl и устанавливаем полноэкранный режим средствами MFC".
И заполним получившуюся функцию:
void CMainWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
switch (nChar)
{
case 'a':
x+=(float)0.03;
break;
case 'd':
x-=(float)0.03;
break;
case 'w':
cameraz+=(float)0.5;
break;
case 's':
cameraz-=(float)0.5;
break;
}
}
Переменную х нужно объявить в классе CMainWnd как float x;. Также перейдите в функцию Transform3D и закомментируйте строку:
//static float x; x+=(float)0.003;
И не забудьте в конструкторе класса окна рамки к значению х присвоить нуль.
x = 0;
В классе окна-рамки объявите переменную:
float cameraz;
Начальное значение присвойте ему в конструкторе класса окна-рамки:
cameraz = -70;
И в функции Transform3D измените функцию D3DXMatrixLookAtLH, вместо -70 укажите cameraz:
D3DXMatrixLookAtLH (&matView, &D3DXVECTOR3 (0.0f, 0, cameraz), &D3DXVECTOR3 (0.0f, 0.0f, 0.0f), &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
Все, можете запускать приложение и клавишами A, D, W, S, Вы можете немного поперемещаться в пространстве. Если Вам не хватает перемещений, можете добавить сами :)
Теперь о недостатках:
Попробуйте приблизить куб и начать его вращать, Вы заметите, как он дергается на экране. Чтобы такого не было и все действия пользователя создаваемые при помощи джойстика, мышки или клавиатуры были плавными, нам нужно использовать DirectInput, но об этом поговорим попозже.